package JUC.异步_无syn;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 同步syn 不加syn都是异步
 *
 * 二者都要start开启
 *
 * 线程池 如果不是 之后还要复用的话 -> 而且不需要 排队/拒绝等 -> 完全不用加 自己start即可
 *      -> 但是 线程池 很简单好写
 *      最终 -> mh-还是写线程池吧
 */
public class AsycnByCall {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // main 里面代码 就是 主线程
        for (int i = 0; i < 3; i++) {
            Thread.sleep(1000);
            System.out.println("主");
        }

        // 用 线程池 运行 这 1个 异步线程 Call
        ExecutorService threadPool = Executors.newCachedThreadPool();
        threadPool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                for (int i = 0; i < 5; i++) {
                    System.out.println("异---------");
                    Thread.sleep(2000);
                }
                System.out.println("异步任务执行完毕，返回执行结果!!!!");
                return "Callable完事";
            }
        });
        //要先 *开启 异步
        for (int i = 0; i < 100000; i++) {
            while (true) {
                // --7.18 = 看看主线程一直占cpu 异步并发还能不能来回切
                // -> 可以！牛逼
                /*
                    主
                    主
                    主
                    异---------
                    异---------
                    异---------
                    异---------
                    异---------
                    异步任务执行完毕，返回执行结果!!!!
                */
            }
        }

        // 不干扰 主线程 -> 并行执行
        for (int i = 0; i < 100000; i++) {
            Thread.sleep(100);
            System.out.println("主");
        }
        //关闭线程池
        if(!threadPool.isShutdown()){
            threadPool.shutdown();
        }
    }
}